package com.estore.service;

import com.estore.model.Product;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;

/**
 * 商品服务类，负责商品相关的业务逻辑
 * 使用ConcurrentHashMap保证线程安全
 */
public class ProductService {

    // 使用线程安全的ConcurrentHashMap
    private final Map<String, Product> productData = new ConcurrentHashMap<>();

    /**
     * 构造函数，初始化商品数据（带标签）
     */
    public ProductService() {
        initializeSampleDataWithTags();
    }

    /**
     * 初始化带标签的示例数据
     */
    private void initializeSampleDataWithTags() {
        // 为Java书籍创建标签
        Set<String> tagsForJavaBook = new HashSet<>();
        tagsForJavaBook.add("编程");
        tagsForJavaBook.add("畅销");
        tagsForJavaBook.add("热门");
        tagsForJavaBook.add("热门"); // 故意添加重复标签，验证Set的唯一性
        System.out.println("Java书籍标签数量（验证唯一性）: " + tagsForJavaBook.size());

        productData.put("p001", new Product("p001", "Java从入门到精通", 99.0, 100, tagsForJavaBook));

        // 为MySQL书籍创建标签
        Set<String> tagsForMySQL = new HashSet<>();
        tagsForMySQL.add("数据库");
        tagsForMySQL.add("技术");
        tagsForMySQL.add("畅销");
        System.out.println("MySQL书籍标签数量: " + tagsForMySQL.size());

        productData.put("p002", new Product("p002", "高性能MySQL", 128.5, 50, tagsForMySQL));

        // 为康复指南创建标签
        Set<String> tagsForHealth = new HashSet<>();
        tagsForHealth.add("健康");
        tagsForHealth.add("生活");
        tagsForHealth.add("健康"); // 再次验证唯一性
        System.out.println("健康书籍标签数量（验证唯一性）: " + tagsForHealth.size());

        productData.put("p003", new Product("p003", "颈椎康复指南", 45.0, 200, tagsForHealth));

        // 没有标签的商品（测试兼容性）
        productData.put("p004", new Product("p004", "生发秘籍", 88.0, 0));

        // 打印所有商品信息用于验证
        printAllProductsWithTags();
    }

    /**
     * 打印所有商品及其标签信息
     */
    private void printAllProductsWithTags() {
        System.out.println("\n=== 所有商品信息（含标签）===");
        for (Product product : productData.values()) {
            System.out.println("商品: " + product.getName());
            System.out.println("标签: " + (product.getTags() != null ? product.getTags() : "无标签"));
            System.out.println("标签数量: " + (product.getTags() != null ? product.getTags().size() : 0));
            System.out.println("------------------------");
        }
    }

    /**
     * 获取所有商品列表
     * @return 商品列表
     */
    public List<Product> getAllProducts() {
        return new ArrayList<>(productData.values());
    }

    /**
     * 根据ID查找商品
     * @param id 商品ID
     * @return 找到的商品对象，如果不存在则返回null
     */
    public Product findProductById(String id) {
        return productData.get(id);
    }

    /**
     * 根据标签搜索商品
     * @param tag 标签名称
     * @return 包含该标签的商品列表
     */
    public List<Product> findProductsByTag(String tag) {
        List<Product> result = new ArrayList<>();
        for (Product product : productData.values()) {
            if (product.getTags() != null && product.getTags().contains(tag)) {
                result.add(product);
            }
        }
        return result;
    }

    /**
     * 获取所有使用的标签
     * @return 所有不重复的标签集合
     */
    public Set<String> getAllTags() {
        Set<String> allTags = new HashSet<>();
        for (Product product : productData.values()) {
            if (product.getTags() != null) {
                allTags.addAll(product.getTags());
            }
        }
        return allTags;
    }
}